﻿/* Samuel Garcia
 * Pablo Tarraga */

using System;

public class Laberinto
{
    public struct Objeto
    {
        public string simbolo;
        public bool existeObjeto;
        public int posObjetoX;
        public int posObjetoY;
    }

    public static void Main()
    {
        // ------------- Intro -------------

        Console.ForegroundColor = ConsoleColor.Yellow;
        int opcion;
        bool juego = false;
        bool salir = false;

        do
        {
            Console.Clear();

            for (int i = 0; i < 6; i++)
            {
                Console.SetCursorPosition(25, i);
                Console.WriteLine("*");
                Console.SetCursorPosition(53, i);
                Console.WriteLine("*");
            }

            Console.SetCursorPosition(25, 0);
            Console.WriteLine("*****************************");
            Console.SetCursorPosition(25, 5);
            Console.WriteLine("*****************************");

            Console.SetCursorPosition(27, 2);
            Console.WriteLine("¡Bienvenido al laberinto!");
            Console.SetCursorPosition(33, 3);
            Console.WriteLine("V0.0.6");

            Console.SetCursorPosition(0, 8);
            Console.WriteLine("1. Jugar");
            Console.WriteLine("2. Nivel");
            Console.WriteLine("3. Estadisticas");
            Console.WriteLine();
            Console.WriteLine("0. Salir");

            Console.WriteLine();

            Console.Write("Elige una opcion: ");
            opcion = Convert.ToInt32(Console.ReadLine());
                
            switch (opcion)
            {
                case 1:
                    juego = true;
                    break;
                case 2:
                    Console.Clear();
                    Console.SetCursorPosition(25, 10);
                    Console.WriteLine("Función aun no implementada.");
                    Console.SetCursorPosition(25, 11);
                    Console.WriteLine("Pulsa INTRO para volver al menú.");
                    Console.ReadLine();
                    break;
                case 3:
                    Console.Clear();
                    Console.SetCursorPosition(25, 10);
                    Console.WriteLine("Función aun no implementada.");
                    Console.SetCursorPosition(25, 11);
                    Console.WriteLine("Pulsa INTRO para volver al menú.");
                    Console.ReadLine();
                    break;
                case 0:
                    salir = true;
                    break;
                default:
                    Console.WriteLine("Elige una opcion valida");
                    break;
            }
        }
        while (juego == false && salir == false);

        // ------------- Juego -------------

        // POSICION INICIAL DEL JUGADOR EN EL TABLERO
        int posJugadorX = 17;
        int posJugadorY = 4;
            
        // OBJETOS
        const int NUMERO_OBJETOS = 2;
        Objeto[] objetos = new Objeto[NUMERO_OBJETOS];
        /* Objeto 0 - Llave
        * Objeto 1 - Puerta */

        // SIMBOLO LLAVE Y PUERTA
        objetos[0].simbolo = "k"; objetos[1].simbolo = "|";

        // CONDICIONES QUE MODIFICAN LA PARTIDA
        bool muerto = false;
        objetos[0].existeObjeto = false; objetos[1].existeObjeto = false;

        // VARIABLES PARA LA POSICION DE LA LLAVE Y DE LA PUERTA
        objetos[0].posObjetoX = 28; objetos[0].posObjetoY = 7;
        objetos[1].posObjetoX = 1; objetos[1].posObjetoY = 1;

        Random rand = new Random();
        ConsoleKeyInfo tecla = new ConsoleKeyInfo();

        string[,] tablero =
        {
            {"X", "X", "X", "X", "X", "X", "X", "X", "X", "X"},
            {"X", " ", "X", "X", " ", " ", " ", " ", "X", "X"},
            {"X", " ", " ", " ", " ", " ", " ", " ", " ", "X"},
            {"X", " ", " ", " ", " ", "X", " ", " ", " ", "X"},
            {"X", "X", " ", "X", " ", "X", "X", "X", " ", "X"},
            {"X", "X", " ", " ", " ", "X", "X", "X", " ", "X"},
            {"X", " ", "X", " ", " ", "X", "X", " ", " ", "X"},
            {"X", " ", "X", " ", "X", " ", "X", " ", " ", "X"},
            {"X", " ", "X", " ", "X", " ", " ", " ", "X", "X"},
            {"X", " ", " ", " ", "X", " ", " ", " ", "X", "X"},
            {"X", " ", " ", " ", "X", " ", "X", "X", "X", "X"},
            {"X", "X", "X", "X", "X", " ", " ", " ", " ", "X"},
            {"X", " ", " ", " ", " ", " ", " ", " ", " ", "X"},
            {"X", " ", " ", " ", " ", " ", "X", " ", "X", "X"},
            {"X", " ", "X", " ", " ", "X", " ", " ", "X", "X"},
            {"X", "X", "X", "X", " ", "X", " ", " ", "X", "X"},
            {"X", "X", " ", " ", " ", "X", " ", "X", " ", "X"},
            {"X", " ", " ", " ", " ", "X", " ", "X", " ", "X"},
            {"X", " ", " ", "X", "X", " ", " ", " ", " ", "X"},
            {"X", " ", "X", "X", " ", " ", " ", " ", " ", "X"},
            {"X", " ", "X", "X", " ", " ", "X", "X", " ", "X"},
            {"X", " ", " ", "X", " ", "X", "X", "X", " ", "X"},
            {"X", " ", " ", "X", " ", " ", " ", " ", "X", "X"},
            {"X", "X", " ", "X", " ", " ", " ", " ", " ", "X"},
            {"X", "X", " ", " ", " ", "X", "X", " ", " ", "X"},
            {"X", " ", " ", " ", " ", "X", "X", "X", " ", "X"},
            {"X", " ", "X", "X", "X", " ", " ", " ", " ", "X"},
            {"X", " ", " ", " ", "X", " ", " ", " ", " ", "X"},
            {"X", " ", " ", " ", " ", " ", "X", " ", "X", "X"},
            {"X", "X", "X", " ", " ", " ", "X", "X", "X", "X"},
            {"X", "X", "X", "X", "X", "X", "X", "X", "X", "X"}
        };

        /* string  [] tablero =
        {
            "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "X   XX     X   XX      XX    XX",
            "XX    XXX  X  XX   XX     X  XX",
            "XX  X      X   X  XXXXXX  X   X",
            "X      XXXXX      X       XX  X",
            "X  XXX        XXXX   X  XX    X",
            "X   XXXX  X  X      XX  XX  XXX",
            "X   XX    X     XX  XX   X   XX",
            "XX      XXX  XXX      X     XXX",
            "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        }; */

        // CREACION DE LA LLAVE
        objetos[0].existeObjeto = true;

        // CREACION DE LA PUERTA
        do
        {
            objetos[1].posObjetoX = rand.Next(1, 7);
        }
        while (objetos[1].posObjetoX != 6 && objetos[1].posObjetoX != 1);

        objetos[1].existeObjeto = false; // La puerta no aparecerá hasta que no se haya recogido la llave

        if (!salir)
        {
            do
            {
                Console.Clear();
                Console.SetCursorPosition(29, 0);
                Console.WriteLine("Presiona ESC para salir");

                // SE IMPRIME EL TABLERO
                for (int fil = 0; fil < 10; fil++)
                {
                    Console.SetCursorPosition(25, 8 + fil);
                    for (int col = 0; col < 31; col++)
                    {
                        Console.Write(tablero[col, fil]);
                    }
                    Console.WriteLine();
                }

                // SE IMPRIME EL ICONO DEL JUGADOR
                Console.ForegroundColor = ConsoleColor.Red;
                tablero[posJugadorX, posJugadorY] = "@";
                Console.Write(tablero[posJugadorX, posJugadorY]);
                Console.ForegroundColor = ConsoleColor.Yellow;

                // SE IMPRIME LA LLAVE SI EXISTE
                if (objetos[0].existeObjeto)
                {
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    tablero[objetos[0].posObjetoX, objetos[0].posObjetoY] = objetos[0].simbolo;
                    Console.Write(tablero[objetos[0].posObjetoX, objetos[0].posObjetoY]);
                    Console.ForegroundColor = ConsoleColor.Yellow;
                }

                // SE COMPRUEBA LA CASILLA DE LA LLAVE
                if ((posJugadorX == objetos[0].posObjetoX) &&
                        (posJugadorY == objetos[0].posObjetoY))
                {
                    if (objetos[0].existeObjeto)
                    {
                        Console.SetCursorPosition(5, 20);
                        Console.WriteLine("Has encontrado una llave.");
                    }
                    objetos[0].existeObjeto = false;
                    objetos[1].existeObjeto = true;
                }

                // SE IMPRIME LA PUERTA
                if (objetos[1].existeObjeto)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.BackgroundColor = ConsoleColor.DarkGray;
                    tablero[objetos[1].posObjetoX, objetos[1].posObjetoY] = objetos[1].simbolo;
                    Console.Write(tablero[objetos[1].posObjetoX, objetos[1].posObjetoY]);
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.BackgroundColor = ConsoleColor.Black;
                }

                // SE COMPRUEBA LA CASILLA DE LA PUERTA
                if ((posJugadorX == objetos[1].posObjetoX) &&
                        (objetos[1].posObjetoY == posJugadorY))
                {
                    if (objetos[1].existeObjeto)
                    {
                        Console.SetCursorPosition(5, 20);
                        Console.WriteLine("La puerta esta cerrada.");
                        Console.SetCursorPosition(5, 21);
                        Console.WriteLine("Pulsa K para usar la llave.");
                    }
                }

                /* MOVIMIENTOS DEL JUGADOR
                SI SE INTENTA MOVER EN UNA DIRECCIÓN Y HAY UNA PARED 'X'
                EL MOVIMIENTO NO SE REALIZA*/
                tecla = Console.ReadKey();

                if (tecla.KeyChar == 'w' || tecla.Key == ConsoleKey.UpArrow)
                {
                    if (tablero[posJugadorX, posJugadorY - 1] != "X")
                    {
                        tablero[posJugadorX, posJugadorY - 1] = "@";
                        if (tablero[posJugadorX, posJugadorY] != objetos[1].simbolo)
                                tablero[posJugadorX, posJugadorY] = " ";
                            posJugadorY--;
                    }
                }
                
                if (tecla.KeyChar == 's' || tecla.Key == ConsoleKey.DownArrow)
                {
                    if (tablero[posJugadorX, posJugadorY + 1] != "X")
                    {
                        tablero[posJugadorX, posJugadorY + 1] = "@";
                        if (tablero[posJugadorX, posJugadorY] != objetos[1].simbolo)
                                tablero[posJugadorX, posJugadorY] = " ";
                            posJugadorY++;
                    }
                }
                
                if (tecla.KeyChar == 'a' || tecla.Key == ConsoleKey.LeftArrow)
                {
                
                    if (tablero[posJugadorX - 1, posJugadorY] != "X")
                    {
                        tablero[posJugadorX - 1, posJugadorY] = "@";
                        if (tablero[posJugadorX, posJugadorY] != objetos[1].simbolo)
                                tablero[posJugadorX, posJugadorY] = " ";
                            posJugadorX--;
                    }
                }
               
                if (tecla.KeyChar == 'd' || tecla.Key == ConsoleKey.RightArrow)
                {
                    if (tablero[posJugadorX + 1, posJugadorY] != "X")
                    {
                        tablero[posJugadorX + 1, posJugadorY] = "@";
                        if (tablero[posJugadorX, posJugadorY] != objetos[1].simbolo)
                                tablero[posJugadorX, posJugadorY] = " ";
                            posJugadorX++;
                    }
                }

                if (!objetos[0].existeObjeto && (posJugadorX == objetos[1].posObjetoX) &&
                    (objetos[1].posObjetoY == posJugadorY) &&
                        (tecla.KeyChar == 'k'))
                {
                    Console.Clear();
                    Console.SetCursorPosition(25, 10);
                    Console.WriteLine("La puerta se ha abierto!.");
                    Console.SetCursorPosition(25, 11);
                    Console.WriteLine("Nivel completado.");
                    Console.SetCursorPosition(25, 13);
                    Console.WriteLine("Pulsa INTRO para continuar.");
                    salir = true;
                    Console.ReadLine();
                }

                // SI SE PULSA ESC, SE SALE DE LA PARTIDA
                if (tecla.Key == ConsoleKey.Escape)
                {
                    Console.Clear();
                    salir = true;
                }
            }
            while (!salir && !muerto);
        }

        int calaveraX = 3;
        if (muerto)
        {
            Console.ForegroundColor = ConsoleColor.White;
            Console.Clear();
            Console.SetCursorPosition(calaveraX, 5);
            Console.WriteLine("                        ..###'                       '###,.");
            Console.SetCursorPosition(calaveraX, 6);
            Console.WriteLine("                         ´####;       .ooooo.       ;####'");
            Console.SetCursorPosition(calaveraX, 7);
            Console.WriteLine("                            ´##,   .o8P'''''Y8o.   ,##'");
            Console.SetCursorPosition(calaveraX, 8);
            Console.WriteLine("                             '##, 88'         '88 ,##'");
            Console.SetCursorPosition(calaveraX, 9);
            Console.WriteLine("                              '##8'             '8##'");
            Console.SetCursorPosition(calaveraX, 10);
            Console.WriteLine("                               '#8   ,o.   .o,   8#'");
            Console.SetCursorPosition(calaveraX, 11);
            Console.WriteLine("                                 8 8 888; :888 8 8");
            Console.SetCursorPosition(calaveraX, 12);
            Console.WriteLine("                                 8P '88'   '88' Y8");
            Console.SetCursorPosition(calaveraX, 13);
            Console.WriteLine("                                 P       8      'Y");
            Console.SetCursorPosition(calaveraX, 14);
            Console.WriteLine("                                 b      888      d");
            Console.SetCursorPosition(calaveraX, 15);
            Console.WriteLine("                                  `8b         d8`");
            Console.SetCursorPosition(calaveraX, 16);
            Console.WriteLine("                                   88''88888''88");
            Console.SetCursorPosition(calaveraX, 17);
            Console.WriteLine("                                   8 `'''''''` 8");
            Console.SetCursorPosition(calaveraX, 18);
            Console.WriteLine("                                    `8ooooooo8`");
            Console.SetCursorPosition(calaveraX, 19);
            Console.WriteLine("                                    ,##'   '##,");
            Console.SetCursorPosition(calaveraX, 20);
            Console.WriteLine("                                   ,##'     '##,");
            Console.SetCursorPosition(calaveraX, 21);
            Console.WriteLine("                                  ,##'       '##,");
            Console.SetCursorPosition(calaveraX, 22);
            Console.WriteLine("                               .#####,       ,#####.");
            Console.SetCursorPosition(calaveraX, 23);
            Console.WriteLine("                                  `##'       '##`");
            Console.ForegroundColor = ConsoleColor.Red;
            Console.SetCursorPosition(36, 27);
            Console.WriteLine("GAME OVER");
            Console.ReadLine();
        }
        Console.ForegroundColor = ConsoleColor.White;
        Console.BackgroundColor = ConsoleColor.Black;
        Console.Clear();
    }
}
